package com.bw.utils.excel;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ImportExcel {

    /*
    * 用于读取excel的工具类
    * */
    public static List<Map> readExcel(String ext, InputStream inputStream) throws IOException {

        //创建存放数据的list集合
        List<Map> list = new ArrayList();

        //创建workbook的对象
        Workbook wb = null;

        //判断后缀名使用不同的对象
        if (".xls".equals(ext)){
            wb = new HSSFWorkbook(inputStream);
        }
        if (".xlsx".equals(ext)){
            wb = new XSSFWorkbook(inputStream);
        }

        //获取sheet页为0的数据
        Sheet sheet = wb.getSheetAt(0);

        //获取最大行数 就是目前的总行数
        int rowNum = sheet.getLastRowNum();

        //将行数进行循环 定位到列
        for (int i=2;i<=rowNum;i++){
            //获取到数据的每行
            Row row = sheet.getRow(i);
            //用map存储每行的数据
            HashMap map = new HashMap();
            //获取每行的列数
            int cellNum = row.getLastCellNum();
            //根据列的下标定位单元格
            for (int j=0;j<cellNum;j++){
                //通过封装将第一行的的数据存到key里面
                String key = getDataKey(sheet.getRow(1).getCell(j));
                //获取每列的数据存到value
                Object value = getDataValue(row.getCell(j));
                //map添加数据
                map.put(key,value);

            }
            //存储到list集合中
            list.add(map);
            System.out.println(map);
        }
        //返回值
        return list;
    }

    public static String getDataKey(Cell cell){
        //获取单元格数据存到key
        return cell.getStringCellValue();
    }

    public static Object getDataValue(Cell cell){
        //如果数据为空时直接返回空
        if (cell==null){
            return null;
        }
        //获取数据类型
        CellType cellType = cell.getCellTypeEnum();
        //定义出对象用于存值
        Object value = null;
        //枚举判断
        switch (cellType){
            case STRING:
                value = cell.getStringCellValue();
                break;
            case BLANK:
                value = null;
                break;
            case BOOLEAN:
                value = cell.getBooleanCellValue();
                break;
            case NUMERIC:
                //判断是否是日期类型
                if (DateUtil.isCellDateFormatted(cell)){
                    value = cell.getDateCellValue();
                }else {
                    value = cell.getNumericCellValue();
                }
                break;
        }
        return value;
    }
}
